{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 零基础实战机器学习 源代码\n",
    "\n",
    "第7讲 预测LTV生命周期价值\n",
    "\n",
    "作者 黄佳\n",
    "\n",
    "极客时间专栏链接：https://time.geekbang.org/column/intro/438"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>6/1/2020 9:09</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>6/1/2020 9:32</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>6/1/2020 9:32</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>6/1/2020 9:37</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>6/1/2020 9:37</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      订单号     产品码           消费日期           产品说明  数量     单价    用户码  城市\n",
       "0  536374   21258  6/1/2020 9:09        五彩玫瑰五支装  32  10.95  15100  北京\n",
       "1  536376   22114  6/1/2020 9:32       茉莉花白色25枝  48   3.45  15291  上海\n",
       "2  536376   21733  6/1/2020 9:32  教师节向日葵3枝尤加利5枝  64   2.55  15291  上海\n",
       "3  536378   22386  6/1/2020 9:37       百合粉色10花苞  10   1.95  14688  北京\n",
       "4  536378  85099C  6/1/2020 9:37       橙黄香槟色康乃馨  10   1.95  14688  北京"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd #导入Pandas\n",
    "df_sales = pd.read_csv('易速鲜花订单记录.csv') #载入数据\n",
    "df_sales.head() #显示头几行数据 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "      <th>城市_上海</th>\n",
       "      <th>城市_北京</th>\n",
       "      <th>城市_广州</th>\n",
       "      <th>城市_成都</th>\n",
       "      <th>城市_深圳</th>\n",
       "      <th>城市_苏州</th>\n",
       "      <th>城市_西安</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>6/1/2020 9:09</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>6/1/2020 9:32</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>6/1/2020 9:32</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>6/1/2020 9:37</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>6/1/2020 9:37</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87175</th>\n",
       "      <td>581585</td>\n",
       "      <td>21684</td>\n",
       "      <td>6/9/2021 12:31</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>12</td>\n",
       "      <td>5.00</td>\n",
       "      <td>15804</td>\n",
       "      <td>深圳</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87176</th>\n",
       "      <td>581585</td>\n",
       "      <td>22398</td>\n",
       "      <td>6/9/2021 12:31</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>12</td>\n",
       "      <td>499.00</td>\n",
       "      <td>15804</td>\n",
       "      <td>深圳</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87177</th>\n",
       "      <td>581585</td>\n",
       "      <td>23328</td>\n",
       "      <td>6/9/2021 12:31</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>4</td>\n",
       "      <td>58.00</td>\n",
       "      <td>15804</td>\n",
       "      <td>深圳</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87178</th>\n",
       "      <td>581585</td>\n",
       "      <td>23145</td>\n",
       "      <td>6/9/2021 12:31</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>12</td>\n",
       "      <td>88.90</td>\n",
       "      <td>15804</td>\n",
       "      <td>深圳</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>87179</th>\n",
       "      <td>581585</td>\n",
       "      <td>22466</td>\n",
       "      <td>6/9/2021 12:31</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>12</td>\n",
       "      <td>78.00</td>\n",
       "      <td>15804</td>\n",
       "      <td>深圳</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>87180 rows × 15 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          订单号     产品码            消费日期           产品说明  数量      单价    用户码  城市  \\\n",
       "0      536374   21258   6/1/2020 9:09        五彩玫瑰五支装  32   10.95  15100  北京   \n",
       "1      536376   22114   6/1/2020 9:32       茉莉花白色25枝  48    3.45  15291  上海   \n",
       "2      536376   21733   6/1/2020 9:32  教师节向日葵3枝尤加利5枝  64    2.55  15291  上海   \n",
       "3      536378   22386   6/1/2020 9:37       百合粉色10花苞  10    1.95  14688  北京   \n",
       "4      536378  85099C   6/1/2020 9:37       橙黄香槟色康乃馨  10    1.95  14688  北京   \n",
       "...       ...     ...             ...            ...  ..     ...    ...  ..   \n",
       "87175  581585   21684  6/9/2021 12:31         产品说明掩码  12    5.00  15804  深圳   \n",
       "87176  581585   22398  6/9/2021 12:31         产品说明掩码  12  499.00  15804  深圳   \n",
       "87177  581585   23328  6/9/2021 12:31         产品说明掩码   4   58.00  15804  深圳   \n",
       "87178  581585   23145  6/9/2021 12:31         产品说明掩码  12   88.90  15804  深圳   \n",
       "87179  581585   22466  6/9/2021 12:31         产品说明掩码  12   78.00  15804  深圳   \n",
       "\n",
       "       城市_上海  城市_北京  城市_广州  城市_成都  城市_深圳  城市_苏州  城市_西安  \n",
       "0          0      1      0      0      0      0      0  \n",
       "1          1      0      0      0      0      0      0  \n",
       "2          1      0      0      0      0      0      0  \n",
       "3          0      1      0      0      0      0      0  \n",
       "4          0      1      0      0      0      0      0  \n",
       "...      ...    ...    ...    ...    ...    ...    ...  \n",
       "87175      0      0      0      0      1      0      0  \n",
       "87176      0      0      0      0      1      0      0  \n",
       "87177      0      0      0      0      1      0      0  \n",
       "87178      0      0      0      0      1      0      0  \n",
       "87179      0      0      0      0      1      0      0  \n",
       "\n",
       "[87180 rows x 15 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "city = pd.get_dummies(df_sales.城市, prefix='城市')\n",
    "df_sales = pd.concat([df_sales, city], axis=1)\n",
    "df_sales"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 整理日期格式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "日期范围（格式转化前）: 1/1/2021 10:11 ~ 9/9/2020 9:20\n",
      "日期范围（格式转化后）: 2020-06-01 09:09:00 ~ 2021-06-09 12:31:00\n"
     ]
    }
   ],
   "source": [
    "df_sales = pd.read_csv('易速鲜花订单记录.csv') #载入数据\n",
    "print('日期范围（格式转化前）: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max())) #显示日期范围（格式转换前）\n",
    "df_sales['消费日期'] = pd.to_datetime(df_sales['消费日期']) #转换日期格式\n",
    "print('日期范围（格式转化后）: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max()))#显示日期范围"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "日期范围（删除不完整的月份）: 2020-06-01 09:09:00 ~ 2021-05-31 17:39:00\n"
     ]
    }
   ],
   "source": [
    "df_sales = df_sales.loc[df_sales['消费日期'] < '2021-06-01'] #只保留整月数据\n",
    "print('日期范围（删除不完整的月份）: %s ~ %s' % (df_sales['消费日期'].min(), df_sales['消费日期'].max())) #显示日期范围"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据可视化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt #导入Matplotlib的pyplot模块\n",
    "#构建月度的订单数的DataFrame\n",
    "df_orders_monthly = df_sales.set_index('消费日期')['订单号'].resample('M').nunique()\n",
    "#设定绘图的画布\n",
    "ax = pd.DataFrame(df_orders_monthly.values).plot(grid=True,figsize=(12,6),legend=False)\n",
    "ax.set_xlabel('月份') # X轴label\n",
    "ax.set_ylabel('订单数') # Y轴Label\n",
    "ax.set_title('月度订单数') # 图题\n",
    "#设定X轴月份显示格式\n",
    "plt.xticks(\n",
    "    range(len(df_orders_monthly.index)), \n",
    "    [x.strftime('%m.%Y') for x in df_orders_monthly.index], \n",
    "    rotation=45)\n",
    "plt.show() # 绘图"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据清洗"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_sales = df_sales.drop_duplicates() #删除重复的数据行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 特征工程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "      <th>总价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>2020-06-01 09:09:00</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "      <td>350.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>165.6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>163.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.5</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "      订单号     产品码                消费日期           产品说明  数量     单价    用户码  城市  \\\n",
       "0  536374   21258 2020-06-01 09:09:00        五彩玫瑰五支装  32  10.95  15100  北京   \n",
       "1  536376   22114 2020-06-01 09:32:00       茉莉花白色25枝  48   3.45  15291  上海   \n",
       "2  536376   21733 2020-06-01 09:32:00  教师节向日葵3枝尤加利5枝  64   2.55  15291  上海   \n",
       "3  536378   22386 2020-06-01 09:37:00       百合粉色10花苞  10   1.95  14688  北京   \n",
       "4  536378  85099C 2020-06-01 09:37:00       橙黄香槟色康乃馨  10   1.95  14688  北京   \n",
       "\n",
       "      总价  \n",
       "0  350.4  \n",
       "1  165.6  \n",
       "2  163.2  \n",
       "3   19.5  \n",
       "4   19.5  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales['总价'] = df_sales['数量'] * df_sales['单价'] #计算每单的总价\n",
    "df_sales.head() #显示头几行数据  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 构建User用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>订单号</th>\n",
       "      <th>产品码</th>\n",
       "      <th>消费日期</th>\n",
       "      <th>产品说明</th>\n",
       "      <th>数量</th>\n",
       "      <th>单价</th>\n",
       "      <th>用户码</th>\n",
       "      <th>城市</th>\n",
       "      <th>总价</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>536374</td>\n",
       "      <td>21258</td>\n",
       "      <td>2020-06-01 09:09:00</td>\n",
       "      <td>五彩玫瑰五支装</td>\n",
       "      <td>32</td>\n",
       "      <td>10.95</td>\n",
       "      <td>15100</td>\n",
       "      <td>北京</td>\n",
       "      <td>350.40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>536376</td>\n",
       "      <td>22114</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>茉莉花白色25枝</td>\n",
       "      <td>48</td>\n",
       "      <td>3.45</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>165.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>536376</td>\n",
       "      <td>21733</td>\n",
       "      <td>2020-06-01 09:32:00</td>\n",
       "      <td>教师节向日葵3枝尤加利5枝</td>\n",
       "      <td>64</td>\n",
       "      <td>2.55</td>\n",
       "      <td>15291</td>\n",
       "      <td>上海</td>\n",
       "      <td>163.20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>536378</td>\n",
       "      <td>22386</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>百合粉色10花苞</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>536378</td>\n",
       "      <td>85099C</td>\n",
       "      <td>2020-06-01 09:37:00</td>\n",
       "      <td>橙黄香槟色康乃馨</td>\n",
       "      <td>10</td>\n",
       "      <td>1.95</td>\n",
       "      <td>14688</td>\n",
       "      <td>北京</td>\n",
       "      <td>19.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14564</th>\n",
       "      <td>545190</td>\n",
       "      <td>22937</td>\n",
       "      <td>2020-08-29 15:32:00</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>6</td>\n",
       "      <td>18.00</td>\n",
       "      <td>15656</td>\n",
       "      <td>苏州</td>\n",
       "      <td>108.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14565</th>\n",
       "      <td>545190</td>\n",
       "      <td>22722</td>\n",
       "      <td>2020-08-29 15:32:00</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>4</td>\n",
       "      <td>39.50</td>\n",
       "      <td>15656</td>\n",
       "      <td>苏州</td>\n",
       "      <td>158.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14566</th>\n",
       "      <td>545190</td>\n",
       "      <td>22457</td>\n",
       "      <td>2020-08-29 15:32:00</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>60</td>\n",
       "      <td>3.00</td>\n",
       "      <td>15656</td>\n",
       "      <td>苏州</td>\n",
       "      <td>180.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14567</th>\n",
       "      <td>545190</td>\n",
       "      <td>22464</td>\n",
       "      <td>2020-08-29 15:32:00</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>12</td>\n",
       "      <td>25.00</td>\n",
       "      <td>15656</td>\n",
       "      <td>苏州</td>\n",
       "      <td>300.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14568</th>\n",
       "      <td>545190</td>\n",
       "      <td>22423</td>\n",
       "      <td>2020-08-29 15:32:00</td>\n",
       "      <td>产品说明掩码</td>\n",
       "      <td>1</td>\n",
       "      <td>12.75</td>\n",
       "      <td>15656</td>\n",
       "      <td>苏州</td>\n",
       "      <td>12.75</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>14569 rows × 9 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "          订单号     产品码                消费日期           产品说明  数量     单价    用户码  \\\n",
       "0      536374   21258 2020-06-01 09:09:00        五彩玫瑰五支装  32  10.95  15100   \n",
       "1      536376   22114 2020-06-01 09:32:00       茉莉花白色25枝  48   3.45  15291   \n",
       "2      536376   21733 2020-06-01 09:32:00  教师节向日葵3枝尤加利5枝  64   2.55  15291   \n",
       "3      536378   22386 2020-06-01 09:37:00       百合粉色10花苞  10   1.95  14688   \n",
       "4      536378  85099C 2020-06-01 09:37:00       橙黄香槟色康乃馨  10   1.95  14688   \n",
       "...       ...     ...                 ...            ...  ..    ...    ...   \n",
       "14564  545190   22937 2020-08-29 15:32:00         产品说明掩码   6  18.00  15656   \n",
       "14565  545190   22722 2020-08-29 15:32:00         产品说明掩码   4  39.50  15656   \n",
       "14566  545190   22457 2020-08-29 15:32:00         产品说明掩码  60   3.00  15656   \n",
       "14567  545190   22464 2020-08-29 15:32:00         产品说明掩码  12  25.00  15656   \n",
       "14568  545190   22423 2020-08-29 15:32:00         产品说明掩码   1  12.75  15656   \n",
       "\n",
       "       城市      总价  \n",
       "0      北京  350.40  \n",
       "1      上海  165.60  \n",
       "2      上海  163.20  \n",
       "3      北京   19.50  \n",
       "4      北京   19.50  \n",
       "...    ..     ...  \n",
       "14564  苏州  108.00  \n",
       "14565  苏州  158.00  \n",
       "14566  苏州  180.00  \n",
       "14567  苏州  300.00  \n",
       "14568  苏州   12.75  \n",
       "\n",
       "[14569 rows x 9 columns]"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_sales_3m = df_sales[(df_sales.消费日期 > '2020-06-01') & (df_sales.消费日期 <= '2020-08-30')] #构建仅含头三个月数据的数据集\n",
    "df_sales_3m.reset_index(drop=True) #重置索引"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "      <th>R值</th>\n",
       "      <th>F值</th>\n",
       "      <th>M值</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15100</td>\n",
       "      <td>45</td>\n",
       "      <td>6</td>\n",
       "      <td>635.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>15291</td>\n",
       "      <td>35</td>\n",
       "      <td>35</td>\n",
       "      <td>1329.95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14688</td>\n",
       "      <td>6</td>\n",
       "      <td>85</td>\n",
       "      <td>1472.28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15311</td>\n",
       "      <td>5</td>\n",
       "      <td>715</td>\n",
       "      <td>12711.66</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>15862</td>\n",
       "      <td>89</td>\n",
       "      <td>64</td>\n",
       "      <td>354.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>365</th>\n",
       "      <td>15951</td>\n",
       "      <td>1</td>\n",
       "      <td>22</td>\n",
       "      <td>375.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>366</th>\n",
       "      <td>14745</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>240.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>367</th>\n",
       "      <td>15724</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>103.65</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>368</th>\n",
       "      <td>15874</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>584.35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>369</th>\n",
       "      <td>15656</td>\n",
       "      <td>0</td>\n",
       "      <td>15</td>\n",
       "      <td>920.35</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>370 rows × 4 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       用户码  R值   F值        M值\n",
       "0    15100  45    6    635.10\n",
       "1    15291  35   35   1329.95\n",
       "2    14688   6   85   1472.28\n",
       "3    15311   5  715  12711.66\n",
       "4    15862  89   64    354.23\n",
       "..     ...  ..  ...       ...\n",
       "365  15951   1   22    375.17\n",
       "366  14745   1    7    240.60\n",
       "367  15724   0    5    103.65\n",
       "368  15874   0    5    584.35\n",
       "369  15656   0   15    920.35\n",
       "\n",
       "[370 rows x 4 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.DataFrame(df_sales['用户码'].unique()) #生成以用户码为主键的结构\n",
    "df_user.columns = ['用户码'] #设定字段名\n",
    "df_user.head() #显示头几行数据\n",
    "df_R_value = df_sales_3m.groupby('用户码').消费日期.max().reset_index() #找到每个用户的最近消费日期，构建df_R_value对象\n",
    "df_R_value.columns = ['用户码','最近购买日期'] #设定字段名\n",
    "df_R_value['R值'] = (df_R_value['最近购买日期'].max() - df_R_value['最近购买日期']).dt.days #计算最新日期与上次消费日期的天数\n",
    "df_user = pd.merge(df_user, df_R_value[['用户码','R值']], on='用户码') #把上次消费距最新日期的天数（R值）合并至df_user结构\n",
    "df_F_value = df_sales_3m.groupby('用户码').消费日期.count().reset_index() #计算每个用户消费次数，构建df_F_value对象\n",
    "df_F_value.columns = ['用户码','F值'] #设定字段名\n",
    "df_user = pd.merge(df_user, df_F_value[['用户码','F值']], on='用户码') #把消费频率(F值)整合至df_user结构\n",
    "df_M_value = df_sales_3m.groupby('用户码').总价.sum().reset_index() #计算每个用户三个月消费总额，构建df_M_value对象\n",
    "df_M_value.columns = ['用户码','M值'] #设定字段名\n",
    "df_user = pd.merge(df_user, df_M_value, on='用户码') #把消费总额整合至df_user结构\n",
    "df_user #显示用户表结构"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 构建标签"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>用户码</th>\n",
       "      <th>R值</th>\n",
       "      <th>F值</th>\n",
       "      <th>M值</th>\n",
       "      <th>年度LTV</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>15100</td>\n",
       "      <td>45</td>\n",
       "      <td>6</td>\n",
       "      <td>635.10</td>\n",
       "      <td>635.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>15291</td>\n",
       "      <td>35</td>\n",
       "      <td>35</td>\n",
       "      <td>1329.95</td>\n",
       "      <td>4596.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14688</td>\n",
       "      <td>6</td>\n",
       "      <td>85</td>\n",
       "      <td>1472.28</td>\n",
       "      <td>4449.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>15311</td>\n",
       "      <td>5</td>\n",
       "      <td>715</td>\n",
       "      <td>12711.66</td>\n",
       "      <td>58218.04</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>15862</td>\n",
       "      <td>89</td>\n",
       "      <td>64</td>\n",
       "      <td>354.23</td>\n",
       "      <td>659.73</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>365</th>\n",
       "      <td>15951</td>\n",
       "      <td>1</td>\n",
       "      <td>22</td>\n",
       "      <td>375.17</td>\n",
       "      <td>375.17</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>366</th>\n",
       "      <td>14745</td>\n",
       "      <td>1</td>\n",
       "      <td>7</td>\n",
       "      <td>240.60</td>\n",
       "      <td>1167.16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>367</th>\n",
       "      <td>15724</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>103.65</td>\n",
       "      <td>212.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>368</th>\n",
       "      <td>15874</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>584.35</td>\n",
       "      <td>4330.67</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>369</th>\n",
       "      <td>15656</td>\n",
       "      <td>0</td>\n",
       "      <td>15</td>\n",
       "      <td>920.35</td>\n",
       "      <td>1425.90</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>370 rows × 5 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "       用户码  R值   F值        M值     年度LTV\n",
       "0    15100  45    6    635.10    635.10\n",
       "1    15291  35   35   1329.95   4596.51\n",
       "2    14688   6   85   1472.28   4449.48\n",
       "3    15311   5  715  12711.66  58218.04\n",
       "4    15862  89   64    354.23    659.73\n",
       "..     ...  ..  ...       ...       ...\n",
       "365  15951   1   22    375.17    375.17\n",
       "366  14745   1    7    240.60   1167.16\n",
       "367  15724   0    5    103.65    212.30\n",
       "368  15874   0    5    584.35   4330.67\n",
       "369  15656   0   15    920.35   1425.90\n",
       "\n",
       "[370 rows x 5 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_1y = df_sales.groupby('用户码')['总价'].sum().reset_index() #计算每个用户整年消费总额，构建df_user_1y对象\n",
    "df_user_1y.columns = ['用户码','年度LTV'] #设定字段名\n",
    "df_user_1y.head() #显示头几行数据\n",
    "df_LTV = pd.merge(df_user, df_user_1y, on='用户码', how='left') #构建整体LTV训练数据集\n",
    "df_LTV #显示df_LTV"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 创建特征集和标签集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>R值</th>\n",
       "      <th>F值</th>\n",
       "      <th>M值</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>45</td>\n",
       "      <td>6</td>\n",
       "      <td>635.10</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>35</td>\n",
       "      <td>35</td>\n",
       "      <td>1329.95</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>6</td>\n",
       "      <td>85</td>\n",
       "      <td>1472.28</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>5</td>\n",
       "      <td>715</td>\n",
       "      <td>12711.66</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>89</td>\n",
       "      <td>64</td>\n",
       "      <td>354.23</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   R值   F值        M值\n",
       "0  45    6    635.10\n",
       "1  35   35   1329.95\n",
       "2   6   85   1472.28\n",
       "3   5  715  12711.66\n",
       "4  89   64    354.23"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = df_LTV.drop(['用户码','年度LTV'],axis=1) #特征集\n",
    "X.head() #显示特征集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0      635.10\n",
       "1     4596.51\n",
       "2     4449.48\n",
       "3    58218.04\n",
       "4      659.73\n",
       "Name: 年度LTV, dtype: float64"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = df_LTV['年度LTV'] #标签集\n",
    "y.head() #显示标签集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 拆分训练集、验证集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "# 先拆分训练集和其它集\n",
    "X_train, X_rem, y_train, y_rem = train_test_split(X,y, train_size=0.7,random_state = 36)\n",
    "# 再把其它集拆分成验证集和测试集 \n",
    "X_valid, X_test, y_valid, y_test = train_test_split(X_rem,y_rem, test_size=0.5,random_state = 36)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 选择算法创建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression #导入线性回归模型\n",
    "from sklearn.tree import DecisionTreeRegressor #导入决策树回归模型\n",
    "from sklearn.ensemble import RandomForestRegressor #导入随机森林回归模型\n",
    "model_lr = LinearRegression() #创建线性回归模型\n",
    "model_dtr = DecisionTreeRegressor() #创建决策树回归模型\n",
    "model_rfr = RandomForestRegressor() #创建随机森林回归模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RandomForestRegressor()"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_lr.fit(X_train, y_train) #拟合线性回归模型\n",
    "model_dtr.fit(X_train, y_train) #拟合决策树模型\n",
    "model_rfr.fit(X_train, y_train) #拟合随机森林模型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 评估模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_valid_preds_lr = model_lr.predict(X_valid) #用线性回归模型预测验证集\n",
    "y_valid_preds_dtr = model_dtr.predict(X_valid) #用决策树模型预测验证集\n",
    "y_valid_preds_rfr = model_rfr.predict(X_valid) #用随机森林模型预测验证集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "R值       1.00\n",
       "F值     153.00\n",
       "M值    1413.83\n",
       "Name: 163, dtype: float64"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_valid.iloc[2] #随便选择一个数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "真值: 4391.9399999999905\n",
      "线性回归预测值: 7549.22894678151\n",
      "决策树预测值: 4596.510000000002\n",
      "随机森林预测值: 4597.711099999998\n"
     ]
    }
   ],
   "source": [
    "print('真值:', y_valid.iloc[2])  #线性回归模型预测值\n",
    "print('线性回归预测值:', y_valid_preds_lr[2])  #线性回归模型预测值\n",
    "print('决策树预测值:', y_valid_preds_dtr[2])  #决策树模型预测值\n",
    "print('随机森林预测值:', y_valid_preds_rfr[2]) #随机森林模型预测值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "验证集上的R平方分数-线性回归: 0.4333\n",
      "验证集上的R平方分数-决策树: 0.3093\n",
      "验证集上的R平方分数-随机森林: 0.4677\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import r2_score,   median_absolute_error #导入Sklearn评估模块\n",
    "print('验证集上的R平方分数-线性回归: %0.4f' % r2_score(y_valid, model_lr.predict(X_valid)))\n",
    "print('验证集上的R平方分数-决策树: %0.4f' % r2_score(y_valid, model_dtr.predict(X_valid)))\n",
    "print('验证集上的R平方分数-随机森林: %0.4f' % r2_score(y_valid, model_rfr.predict(X_valid)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 绘制预测值和真值的散点图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_preds_rfr = model_rfr.predict(X_test) #用模型预随机森林模型预测验证集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Text(0.5, 1.0, '实际值 vs. 预测值')"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAETCAYAAAAcboCHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAs6ElEQVR4nO3dfXyV5Z3n8c8vD0CCCARQMAUcBHnGAYJFQS1QAQewCOh06vNIpbhdO9NZZtrXrjud2e22s92d2XY6YtFaW23rswhYBAVsQRQFARUsCpaWRCBBAgQJhOT89o/7joaQkJOcp5xzvu/XKy/uc933fc51HZLzO9ezuTsiIiJtlZPqDIiISHpTIBERkZgokIiISEwUSEREJCYKJCIiEhMFEpEGzCwv1XloD/Q+SGsokEhaMrOhZnZpnJ9zOPCumeWHjy82s1Iza7d/J2aWb2a5jdI6xPicafc+SGqZ5pFIOjKz+4DL3H1eM+e3APlAEfAMsAlYBNSFl+QAD7n7/Q3u+SegEzAEKAY6AAOBneElx9x9cvxLEz0zexT4M6AQqAZWAdcCA4DD4c9xd58RXv8wQdn3AVc3eKqfAWXAJ8AWdx/T4DXa/fsg7YsCiaQFM9tP8CF5uplLOgPl7j4hvH4j8BXgH4FfAesA3L02PJ8L5Lj76fBxAbAXmAD8EagFLgf+2d2nmZkBHdz9VEIKGCUz6wbMBu4Evu3uG8P0peHj9xpdnwdMBz4PbAbeBhYCLwL/FbgBWObuXwivT4v3QdoXVVUlXdQB04DHgXvc/c+Bp4G/Co/vbHR9BDBgPLABPgsi4XEdYOEHI8C9wAXAofCetwm+tY8ys83ADtrH38sxYDDwhrtvNLMrzWwHQZD9hpmtM7N/hKBwQL67ryB4/44C64ETBO/PaaCm0fOny/sg7Yh+ISRdfIngQ3Qd8AszmwFcD3QNz78KTGp0zxjgQ4Jv4xvMbIOZlZvZO2a2Ibynv5kNAP4OqAjvywe2u/swd+/j7iUETUnN1YYAMLPbzeyBBo+fN7Nrw+P7zOxA+LOgLW+Amf05sBoYDfy5mb0I9AG2AvcTvD9PEAQJgBHAm2Z2d4OnKTvH88flfZDso0AiacHdtwDfBf4HQe1jDZBH8E0cDzT+dv0OwQftLncf7+4TCT6I/7O7T3T3ce6+l6B/4X8D5eF9EWBqGHg2hEGndxTZfB6YAp92eF8GrDOzIuA+YDjw58B1bXgLIKgdTCdoovoJQc3ko/BcTz4Lqg7g7u8QBNG3w/Qczh0E4vU+SJbRED9JC2bWCfgGcAtwibuvN7PuwPEG13QAat29/ht5DfAs8JdmVkfQpAPQwcyWA/Pc/ZS7vwy8bGZ3NHjJPwCPNXg8tKU8uvsRM9ttZsMIAtgad681syPA74F/Iegcv7mVxa9//ggQ+aw1jmEEwQmgO3CwiXs+MbNdwF8QDDyoCk+d9SUyXu+DZB/VSKTdCzvGtxB8E78X+LqZvQP0BZaZ2eZwlNYWzvygG0bQDJQD/CfCvhKCAFMHzD/Hy1YBuxv8RNuc8zTBh/ZfhMf1AeDy8PHVwFuxDtENn7eaz74MjgJ2hcf59deYWVfgFaCUoO9jD/A+QX9JXsNrm9HW90GyiGok0u6FHeP137zrO5EfI+gv+Q2wrplRRGMI+gTKgd+7+64G3+b/F/Ccmf3U3U82ce8o4DsNHneLMrtLCUaJdQG+Feb30jC/U4CNwB0EtYMDUT7nuXwILAZ+SNA/kgdUNjg/leD9WWJm/0HQJDieIKj9A8EQ4nNp6/sgWUQ1EkkrZjaOIIB0BP4emAfsNLPG80nygcfc/V5gLvB/zexzwIUEXSpvACuA/g3uySGYM2HA6rAfZWLYt3IAyGk8+a8xd/+YoI/ig/qhxe7+PsEH+B6Cb/U/dvcDYXkOmVnHVpS/gODDvC587nJgIkF/0EUETXkXNrjlq8BTZjaLoH/mOYIhvf8e9jvVcfbnQMzvg2QXzSORtBCOdPp7ggl0/+Luv2xw7mrgIeAld/9PYdpbwBx332tm5u5uZs8Q9F3MDj+AG7/GHuBBgtFgkcbngVzgv7n7mjgXL2pm9iBQQtB05gQ1kQLgJnc/aWaTgJ8TdMQXAisJmtOeIRg2/cewRjfQ3T8ws7UEExIXNXiNdv8+SPuiQCJpwcx6Axe6+/ZmzhcAnd39UHJzljphQJgGrPIGf8hm1t3dK5u/84znyA2bDkXaTIFERERioj4SERGJiQKJiIjEJCOH//bs2dMvvvjiVGdDRCStbNmy5ZC792rtfRkZSC6++GI2b96c6myIiKQVM/tjW+5T05aIiMREgURERGKiQCIiIjFRIBERkZgokIiISEwyctSWiEi2Wbq1jB+s2sVHR6q5qFsBi6YNZvbo4qS8tgKJiEiaW7q1jG8/+w7Vp4Nl08qOVPPtZ98BSEowUdOWiEia+8GqXXC6mu524tO06tN1QXoSKJCIiKS5yLGDfKnTTi7MOX5G+kdHWtq3LD7UtCUikqYqKyvJycmhU5furDp2KZVeeMb5i7oVJCUfqpGIiKSZSCTCxo0befDBBykrK+Mb00dyMq/LGdcU5OeyaNrgpORHNRIRkTTi7vzqV7+irq6O+fPnU1RUxLDwXKpGbWXkxlYlJSWuRRtFJJPU1tayY8cORo0axeHDhykqKiLYJDN+zGyLu5e09j7VSERE2rl9+/axbNkyevTowbBhw+jRo0eqs3QGBRIRkXZs3759PPnkk0yfPp1hw4bFvRYSDwokIiLt0J49e6irq2PQoEHcc889FBQkZwRWW2jUlohIO1JdXc3SpUtZvnw5eXl5mFm7DiKgGomISLuyfPlyunTpwj333EOHDh1SnZ2oKJCIiKRYVVUVa9euZerUqcydO5fc3NxUZ6lV1LQlIpIi7s5bb73FAw88QJcuXcjPz0+7IAKqkYiIpExlZSXbtm3jtttu48ILL0x1dtpMgUREJIkikQibNm2iqqqKqVOncuedd7bLIb2tkdCmLTPLN7Pl4fE4Mys1sw3hz2Az62RmK8xsu5k9aoGo0hKZbxGRRDh48CA//elPef/99ykpCSaQZ8LHWcJqJGZWAGwCLg2TugOL3f27Da6ZD5S6+0wzWwFcC/SLMm11ovIuIhJP7o6Z8cEHHzBmzBjGjBmTEQGkXsJqJO5e7e6jgNIwqTsw18zeMLNnwlrFZOCl8PxaYFIr0kRE2r19+/axePFiysvLmThxImPHjs2oIALJHbW1G7jP3S8H+gDXAD2Ao+H5Y0BRK9LOYGZ3m9lmM9tcUVGRsEKIiETj9OnTvPjiizz55JNcc8019OrVK9VZSphkdrbvBd5tcHwBcAjoGqZ1DR+fF2XaGdx9CbAEgtV/4515EZFo1dTUYGbk5OSwcOFCCgsLW74pjSWzRvJN4MtmlgOMIAgqa4Cp4fnJwLpWpImItCv1y5s8/fTT5OfnM3Xq1IwPIpDcQPJj4E6CDvjn3H0n8Eug2MzeBg4TBIxo00RE2o0PPviA+++/n44dOzJv3rxUZyeptLGViEgMqqqqKCwspKysDDOjb9++qc5Sm2ljKxGRJHJ3tm7dypo1a7jxxhu5+OKLU52llFEgERFppdraWn71q19x6tSptF/eJB4USEREohSJRNi/fz/FxcWMHz+egQMHkpOjtW/1DoiIROHgwYM8/PDD/Pa3v8XdufTSSxVEQqqRiIi0YOfOnbzwwgtMmTKF0aNHZ9zM9FgpkIiINKO0tJTOnTtz8cUXs2DBAs4///xUZ6ldUr1MRKSRmpoaXnzxRZ544gmOHDlCYWGhgsg5qEYiItKAu/PII49wwQUXZMXyJvGgQCIiQrC8ybZt2xg/fjxf+cpXOO+881KdpbShQCIiWc3dee+991i5ciXDhg0jEokoiLSSAomIZLU9e/awbt06brrpprRe3iSVFEhEJOvUL2/SqVMnhg4dyoIFC8jL08dhW+mdE5GscvjwYVasWMGpU6e4/vrrMTMFkRjp3RORrPLSSy8xcOBAxo8fr5npcaJAIiIZ7+DBg6xdu5bZs2dz0003aWZ6nCmQiEjGqq2tZf369WzevJnJkyfTqVMnBZEEUCARkYzk7hw5coSKigotb5JgCiQiklFqampYu3YtZsa0adO46aabUp2ljKeeJhHJGHv27GHx4sWcPHmSq666KtXZyRqqkYhI2qutrSUvL4+KigpmzJjBwIEDU52lrKIaiYikLXdn586d/OhHP6KysvLTXQsluVQjEZG0dOLECZYvX86hQ4e48cYb6d69e6qzlLUSWiMxs3wzW97g8c/N7HUzW2ZmeWY2zsxKzWxD+DPYzDqZ2Qoz225mj1rgrLRE5ltE2i935/jx4+Tn59O3b18WLFigNbJSLGGBxMwKgC3AteHjiUCeu48HzgemAt2Bxe4+MfzZBdwClLr7ZeH5a5tJE5Esc/jwYR599FFWr15Nfn4+V155pZY3aQcSFkjcvdrdRwGlYdJB4IeNXrc7MNfM3jCzZ8KaxmTgpfD8WmBSM2kikkW2bdvGQw89xMCBA5k9e3aqsyMNJC2Uu/sHAGZ2AxABVgOXAfe5+wtmthG4BugBHA1vOwYMbibtDGZ2N3A3QL9+/RJXEBFJqoqKCoqKiujVqxfz58+nqKgo1VmSRpI6asvMrgfuBWa5ey2wF3g5PL0XuAA4BHQN07qGj5tKO4O7L3H3Encv6dWrV6KKICJJUltby7p163jkkUcoLy+nuLhYQaSdSlogMbPewCJgprtXhcnfBL5sZjnACOBdYA1B/wkETVrrmkkTkQxVU1PDkiVLOHjwIAsWLKBPnz6pzpKcQzJ7qW4H+gCrwkFXDwM/Bn4NfB14zt13mtkeYI6ZvQ1sJwgiHZpIE5EMU1NTQ2lpKQMGDOD666+nuLhYiyymAXP3VOch7kpKSnzz5s2pzoaItMKePXtYsWIFAwYMYNasWanOTlYysy3uXtLa+zRuTkRSbsuWLaxfv56ZM2dqZnoaUiARkZTZuXMnvXv3ZtiwYYwYMYKOHTumOkvSBlprS0SSrqqqiieeeIJ169Zx6tQpCgoKFETSmGokIpJUkUiEX/ziFwwdOpS5c+dqZnoG0P+giCRFZWUlb731FpMnT+arX/0qHTp0SHWWJE7UtCUiCRWJRHjttdd48MEH6dSpE+6uIJJhVCMRkYTatWsX77//vpY3yWAKJCISd7W1taxfv56ePXsyYsQIhgwZoomFGUyBRETiqrS0lGXLllFUVMTYsWMVQLKAAomIxIW7Y2Zs2rSJa665hmHDhimIZAl1totIzPbs2cNPf/pTampqmDt3LsOHD1cQySKqkYhIm1VXV7N69Wr+8Ic/MHPmTI3GylIKJCLSJnV1dXzyySd06NCBhQsXamZ6FlMgEZFWqaqq4je/+Q09e/ZkypQpXHfddanOkqSYAomIRG3btm289NJLjB07lquvvjrV2ZF2QoFERFp04sQJCgsLiUQi3HrrrfTu3TvVWZJ2RIFEWmXp1jJ+sGoXHx2p5qJuBSyaNpjZo4tTnS1JkEgkwqZNm9iwYQNf+9rXGDNmTKqzJO2QAolEbenWMr797DtUn64DoOxINd9+9h0ABZMMdOzYMZ588kny8/O566676NKlS6qzJO2UAolE7Qerdn0aROpVn67jB6t2KZBkkNraWqqqqujSpQuXX345I0eO1JwQOSdNSJSofXSkulXpkn727dvHT37yEzZt2kReXh6jRo1SEJEWqUYiUbuoWwFlTQSNi7oVpCA3Em+vvvoqr7/+OtOnT2fYsGGpzo6kEdVIJGqLpg2mID/3jLSC/FwWTRucohxJPOzdu5fa2loGDhzIwoULtbyJtFpCA4mZ5ZvZ8vC4k5mtMLPtZvaoBdqclsh8S9Nmjy7me3NGUtytAAOKuxXwvTkj1T+Spqqrq3n++edZunQpR44c4cILL6SwsDDV2ZI0lLCmLTMrADYBl4ZJtwCl7j7TzFYA1wL9Ykhbnai8S/Nmjy5W4MgA1dXVLF68mKFDh2p5E4lZwgKJu1cDo8xsd5g0GXgmPF4LTAL6x5CmQCLSSlVVVZSWljJ06FDuuOMO7VgocZHMPpIewNHw+BhQFGPaGczsbjPbbGabKyoqElIAkXTl7mzdupUHHniA8vJyAAURiZtkjto6BHQNj7uGj8+LIe0M7r4EWAJQUlLi8c++SPrauHEjO3bs0PImkhDJrJGsAaaGx5OBdTGmicg5RCIRXnvtNT7++GPGjRvH/PnzFUQkIZIZSH4JFJvZ28BhguAQS5qINKO8vJyHH36Y999/n5ycHDp06EBOjkb7S2IkvGnL3QeG/54CZjY6HUuaiDShtraWp556ivHjxzNmzBjNCZGE08x2kQxRWlrKtm3bmDFjBgsXLlQNRJJGgUTiRkvMp0ZNTQ1r165lx44dTJ8+HUBBRJJKgUTiQkvMp86uXbuorq5m4cKFmpkuKaFAInGhJeaTq7q6mtWrV3PJJZcwcuRIRo4cmeosSRZrsf4brpfV5PKuZpZjZn8Z/2xJutES88mzc+dOFi9eTH5+PoMGDUp1dkSiqpFcAQwxs31ArybO/xXwRFxzJWlHS8wnXiQSwczYs2cP8+bNo1+/fqnOkggQ3TySWqAOWARcAlwJfItgvauBgGaRi5aYT6CGy5vU1dUxa9YsBRFpV85ZIzGzAcA3CAJJH+AFYBAwGHgN2A6UJDiPkgbq+0E0aiu+jhw5wvLly6murmbOnDnk5albU9qfln4rD/PZUvANax7e6F8RLTEfR5FIhNraWmpraxkwYABXXHGFhvRKu3XOQOLuR8xsE8GKu4OBxUABQe2kGDgOHEx0JkWySXl5OcuWLWPIkCFMnDiRnj17pjpLIufUUtNWLkEH+zvAF929rtH5HGBl4rInkl3Wr1/P66+/zuTJkxkzZkyqsyMSlZaatj4HfJNg2fbfN7FmTw7wxwTkSySrVFZW0r17d4qKiliwYAHnn39+qrMkErWWmrb+CFxtZiOB7wIDgL8l6DsBMEB7dIq0UcPlTRYuXMjw4cNTnSWRVotqCIi7vwNcb2ZfBva5++8Tmy2RzPfxxx/z2GOP0a9fPy1vImmtxUBiZrn1fSPu/njisySS2aqrq6mqqqKoqIhZs2YxYMCAVGdJJCbR1Eh+bmY1zZy7EHjC3X8RxzyJZKydO3eycuVKPv/5zzNx4kQFEckILQYSd7/FzP4ncLrRfY8AJwHt3SkShVWrVrF7925uvPFGzUyXjBJN01YO8HOCXQrrFQD7gcnuviJBeRNJe+7Ojh07GDJkCOPGjWPKlCmanS4ZJ5rf6PuA4QSTDxvaD1QBCiQiTaisrGTFihVUV1fTr18/ioqKUp0lkYSI9qvR/wH+mWAWey5QA+wA1Pku0oSqqioeeughJkyYwPjx47W8iWS0aAPJzcCbDR53B/oDL5nZfHf/Q9xzJpKGysvL2b9/P5dddhn33HMPnTt3TnWWRBIumkCyHOgKvE+wbPwe4PPAB8BLUT5H1tH+5dmltraWDRs28OabbzJlyhQABRHJGtHUt+8jCB5VwH8DyoADwNcJmrz6RvtiZvYFM9sQ/uwzs380s9IGaYPNrJOZrTCz7Wb2qAXOSmtDWZOmfv/ysiPVOJ/tX750a1mqsyYJ8tvf/pYDBw6wYMECrZElWSea2sQ33P1PZtYD+Ht3d+BV4FUz6wVcHO2LufsrwEQAM3sBqAQWu/t3668xs/lAqbvPNLMVwLVAvybSVkf7usmm/cuzQ01NDevWrWPs2LFcc8015Obm0s6/44gkxDlrJGaWB9wfPnwG+L9mttbM1pnZPcBVwL83t6f7OZ63kKCZ7CAw18zeMLNnwprGZIImM4C1BDsxNpXWbmn/8sz34YcfsnjxYk6cOEFhYSF5eXkKIpK1Wlq0sbbBrPY/AP+PYLfEUoLhwE8B17p7az8hrwXWALuB+9z9BTPbCFwD9ACOhtfV74PSVNoZzOxu4G4g5ZO9tH95ZqupqWHNmjXMmDGDgQMHpjo7IikXTR/JxLA5KQ8YDdwK/Aj4DbANaMvX7FkE80/2Ai+HaXuBCwiWrO8apnUNHzeVdgZ3X+LuJe5e0qtXrzZkKX60f3lm2rlzJ88++yz5+fnMnz9fQUQk1FLTlgGvu/tMYCQwCugAfAz8jKBG8evWvGD4nF8gaKL6JvDlcPb8COBdgprK1PDyycC6ZtLardmji/nenJEUdyvAgOJuBXxvzkj1j6SpqqoqnnzySdatW0dJSQlmpmYskQZa6mzPAZ4Pj/+KIJAcJBi5dcLdy8xsiJmNcfe3onzNccBOdz9pZj8mCERfB55z951mtgeYY2ZvA9sJgkiHJtLaNe1fnv6CcSWwd+9eevbsyZw5c7S8iUgTrP6PpdkLzMqAfyHodP81sMXdv9/gfJ671yY0l61UUlLimzdvTnU2JI3VL29SUlLC0KFDU50dkaQwsy3uXtLa+6L5evUmQd/FG8A+YIKZLQvP5QIbCXZPzFiaXJg93J1Nmzaxfv16rrzySgYPVr+WSEuiCSRdgBcIaiQ/cvd59SfC/o7XyOBAUj+5sH5eSP3kQkDBJMOcPn2avLw8jh8/zl133aVFFkWi1OKoLXef4u6vuftHwH80nFXugfEJzWGKnWtyoWSGuro6XnnlFZYsWYK788UvflFBRKQVWtVz6O7terRUImhyYWY7cOAAzz77LN27d+fWW2/VKr0ibaAhKC3Q5MLMVFNTQyQSIT8/n6uvvprhw4drSK9IG+nrVwuyaXLh0q1lTPj+Wv7sWy8w4ftrM3aRyfrlTXbs2EGPHj0YMWKEgohIDFQjaUF9h3qmj9rKlkEFK1asYPfu3cyYMYNBgwalOjsiGaHFeSTpSPNIWm/C99c22YRX3K2AV781OQU5iq+PPvqIiy66iN27d9O3b186duyY6iyJtDuJnEciCdDe5qZk6qCCqqoqVq5cSUVFhdbHEkkQ9ZGkQHvc+Kq5wQPpPKhg//79PPDAA/Ts2ZMFCxaoFiKSIAokKdAe56Zk0qCCyspKPvroI3r16sVtt93G5MmTtUaWSAIpkKRAe2xGyoQViyORCK+99hoPPvggBw8eJC8vjwsvvDDV2RLJePqalgLtdW5Kuq9Y/Pzzz3P06FHuuusuevTokersiGQN1UhSIJOakVKtrq6O119/ndraWr74xS9y++23K4iIJJlqJCmQLXNTEq20tJRly5ZRVFTEqFGj6NKlS6qzJJKVFEhSJN2bkVKtsrKSJ554gunTpzNs2DDNTBdJIQUSSSsffvghH3/8MePGjePee+8lPz8/1VkSyXrqI5G0UF1dzfPPP8+yZcvo1q0bgIKISDuhGomkhd/97nfk5+ezcOFCTSwUaWcUSNJUe1tiJRGqqqpYtWoVX/jCF5g6dar6QUTaKQWSNJTpK/W6O9u2bePll19m7NixdOvWTUFEpB1TIEmRWGoU51piJd0Dibtz6tQpdu7cya233krv3r1TnSURaUHSOtvNbJyZlZrZhvDnMjNbYWbbzexRC3SKJi1ZeU6UWBdtbI9LrMSqfnmTp556ik6dOnHzzTcriIikiWSO2uoOLHb3ie4+ERgHlLr7ZeG5a4FbokxLiXjtIBjroo2ZtlJveXk5Dz/8MLt27WLKlCmpzo6ItFIym7a6A3PN7EvAPqAGeDo8txaYBPQHnokibXWS8vypePZLxFqjWDRt8Bl5gfRcYqWuro6cnBwqKioYPXo0Y8aMUV+ISBpKZo1kN3Cfu18O9AHmAEfDc8eAIqBHlGlnMbO7zWyzmW2uqKiIe+bjufR7rDWKTFipt7S0lJ/85Cfs2bOH4cOHM3bsWAURkTSVzBrJXuDdBsejga7h467AIeC8KNPO4u5LgCUQbLUb15wT336JeNQo0nWJlbq6Ol5++WXeffddpk2bxiWXXJLqLIlIjJJZI/km8GUzywFGAH8HTA3PTQbWAWuiTEu6ePZLZEKNoi0++eQTcnJy6Ny5MwsXLmTEiBGqhYhkAHOP+5f3pl/IrA/wa6Az8BvgfxH0ffQDtgO3AR2iSfMWMl1SUuKbN2+Oa/4b95FAUIvIhgAQq+rqalavXs2BAwe4++67FTxE2ikz2+LuJa29L2lNW+6+H/hCo+SZjR6fijIt6bT0e9vs3buXZ599liFDhnDHHXcoiIhkoKTVSJIpETUSaZ2qqipyc3M5efIkVVVV9O/fP9VZEpEWtLVGotV/Ja7cna1bt/LAAw+wd+9eioqKFEREMpyWSImztix9kikLMLo7jz/+OFVVVVreRCSLKJDEUVsmLWbCAoyRSIQPP/yQgQMHctVVV3HRRReRk6PKrki20F97HLVl0mI8JzqmQv3yJhs2bKC2tpbPfe5zCiIiWUY1kjhqy6TFdF6Ace/evTz11FNMmjRJM9NFspgCSRxd1K2AsiYCwLkmLbblnlQrLS3F3enbty8LFizg/PPPT3WWRCSF1AYRR4umDaYgP/eMtJaWPmnLPalSU1PDiy++yOOPP051dTW5ubkKIiKiGkk8tWXSYjpNdHz66acpKCjgnnvuobCwMNXZEZF2QhMSG8mUobjxUl1dzcaNG7nmmmuoq6ujY8eOqc6SiCRIu18iJR1kwlDceHrvvfdYuXIlQ4YMIRKJKIiISJMUSBpobijuPy3f0aZaSjrXbsrLy1m7di3z5s2jX79+qc6OiLRjCiQNNDfktvLEaSpPnAair6WkY+3G3dm2bRsnTpxgwoQJLFy4UHNCRKRF+pRoINoht9FMGGzrRMN47QvfWpWVlTz22GO8+eabn242pSAiItHQJ0UDTQ3FbU5LEwbbMtGwvhZTdqQa57NaTDKCyRtvvMGAAQOYP3++1sgSkVZRIGmgqZ0LuxXkN3ltS7WXtuyomOzlUsrLy3nkkUc4fPgw06ZNY8KECaqFiEirqY+kkcZ7oTe3M2JLEwab2pfdCGoZE76/tsmO92Qtl1JXV8f69et58803mTRpEt27d4/r84tIdlEgaUFbJww2vK/sSDUG1M/Yaa7jvVth/qed+g3Fc7mUSCRCTU0NR44c0fImIhIXmpAYg2iH9074/tom19Mq7lbAq9+a/OlzLXpqO6cjZ/5/5OcaP5h3WcwjvWpqali3bh1Hjx7lpptuium5RCQzaUJikrVmeG80TVY/WLXrrCAC0LlDXsxBZO/evSxbtoy+ffsyc+bMmJ5LRKQxBZIoNa59nKipbbZjvHEfS44ZdU3U/Bo2WTUXbI5Wn93UFa2TJ0/SsWNHTp48yXXXXcegQYPa/FwiIs3REJ0oNDUst6m+DMJz9cN16+9rKog07rBvyyivc3nvvfe4//772bdvH0OGDFEQEZGESWogMbOfm9nrZrbMzMaZWamZbQh/BptZJzNbYWbbzexRC5yVlsw8Q9PDcs+lfu5Hc/flmvG9OSPPqLnEazn506dP8+STT7JmzRotbyIiSZG0QGJmE4E8dx8PnA/0ARa7+8TwZxdwC1Dq7pcB3YFrm0lLqtYOv61v4mruvoj7Wf0eTc1haRxszsXdOXz4MHl5eQwcOJCvfe1rCiIikhTJ7CM5CPwwPM4hCApzzexLwD5gHjAZeCa8Zi0wCejfRNrqJOUZaH4Xw24F+Rxppg+j7Eh1s+eba65qPIclWpWVlaxYsQKAW265hTFjxrT6OURE2ippNRJ3/8Dd3zCzG4AI8HvgPne/nKB2cg3QAzga3nIMKGom7SxmdreZbTazzRUVFXHNe3PNTt+5fjjF5+jD+KSmlvycM1vi4r374XvvvceDDz7IgAEDuPnmm7VvuogkXVJHbZnZ9cC9wCygA7AtPLUXuAA4BHQN07qGj89rIu0s7r4EWALBPJJ45rulSYmNZ7DXO13ndC/Mp7BDXtyXki8vL6dz58706dOHu+66ix49esT8nCIibZG0QGJmvYFFwHR3/8TMvgu8b2aPAiOA/0kQNKYSNGVNBv4N6NdEWtI11+xUn/Y3T2xr8r4jJ06z9b9PjVs+Gi5vMnfuXAYMGBC35xYRaYtkjtq6naAJa5WZbQBOAHcCm4Dn3H0n8Eug2MzeBg4Da5pJa1dmjy5utokr2uG70SwfH4lEePjhh9m/fz8LFixQEBGRdkFLpDShLTsbNre4YzQjr1q6t6amhl27djFy5EgOHTpEjx491BciInGnJVLipK07G7Z1ccf6e5qbJT+q6ymWL19Ov379GD58OD179mxr0UREEkKBpJFzfag3FRTisS97c/NNco7tZ9myt5kxY4ZmpotIu6VA0khr9gSJ177sjeep9M+p5BS5eJcLWbhwHh07dmxNEUREkkprbTXSrTD6HRHjtaNh/TyVAmqY1GE3Y/LLyMvN479MH6ogIiLtnmokDSzdWsbxk7VnpecYTU4ijNeOhvW1l3XLn2JfTQG7Ow/nv0wfGpf5JiIiiaZA0kBze4JEHDb/8fBZfSHNLZ3SmhV7KysrWb9+PTOuu45Zo/4zubm5Ld8kItKOKJA0cK6axC9f/9NZW+XOHVvMM1vKWr2fOwRzQt544w1+97vfMWHCBHJzc8nJObulMR6d+SIiiaRA0kBzNQz4bL/1etWn61ixfT/fmzPynB/0zQWCAwcOsGvXrnMubxKvznwRkURSIGlg0pBePPb6n6K+vn5l3/p91xtrHAj2H/mEx55bycH3+7DgL2dw2223nXNiYWuHIouIpIJGbTXw3FtnL0vSknON0GoYCHraca7v+B5dOc4THwZve0uz0+PVmS8ikkiqkYSWbi3jk5rod0Gsd64P9eCcA0a/3CNsr+3DH+q6YzWRqJ47Hp35IiKJphpJqLVzP+qd60N9xPknuaHjDgqp4a3az/GHuiLAog4E8dp+V0QkkVQjCbW1uWjSkF5npZ08eZJVq1ZxRd5eXj7ZnxN0+PRcawJBLOt3iYgkiwJJ6Fwjts7lmS1llPQvYvboYpZuLeNfX9zJwaMnuOK8Q8yaNodheR1iCgRt3X5XRCRZFEhCi6YNbnZzqnOpH0V1+uQJVr24kv6RHP7En/HK8d5sWraL780Z2eyoLhGRTKA+ktDs0cXktnGLjw5VZWxd/RSH6zqy8XT/T9Pbsu6WiEi6UY0ktHRrGXWt3OOrkBpOkE+XzoWsqhrEx1541jUaqisimU41ktB3lu2I+lrDGZZ7kC912kmf/FP89XXj6dS16dnpGqorIplONZJQ/Sz1lnSglms7fkDEjfU2gn+YU/JpZ3hT2+VqqK6IZDoFkij9640jWbJqG7uO5VLWoT+3X3cFi8d87tPzGqorItlKgSQKf1ZwkoNvvMCCob254Ybrm71OQ3VFJBspkLRgUG4FY72MTn2vYvaMq1KdHRGRdictOtvNrJOZrTCz7Wb2qLW02mEbdG+0xW6fnGN04jRldV157uRwHnq3tsVFFkVEslFaBBLgFqDU3S8DugPXxvsF/nHWcPJzjQ7UMiF/LxPz93Ke1XCCDpwiv02z3kVEskG6BJLJwEvh8VpgUrxfYPboYv73nJHM6vgedRhLTw3nkHf+9LwRzDUREZEzpUsg6QEcDY+PAUWNLzCzu81ss5ltrqioaNOL3DC2L+Onz2XT6f6c5sxVd522rxAsIpLJ0iWQHAK6hsddw8dncPcl7l7i7iW9ep29Im+0brxi0Fnb6tbTLHURkbOlSyBZA0wNjycD6xL5YsXNzEbXLHURkbOlSyD5JVBsZm8DhwkCS8JoQykRkeilxTwSdz8FzEzW62mWuohI9NIikKSCZqmLiEQnXZq2RESknVIgERGRmCiQiIhITBRIREQkJubeyv1l04CZVQB/bOPtPWliwmOWUNmzk8qefZord393b/WM7owMJLEws83uXpLqfKSCyq6yZ5tsLXu8y62mLRERiYkCiYiIxESB5GxLUp2BFFLZs5PKnn3iWm71kYiISExUIxERkZgokIiISEwUSEJm1snMVpjZdjN71Mws1XmKBzPLN7Pl4fFZZYwlLdVla4mZ/dzMXjezZWZ2XraU3czyzOwpM3vVzB7Owv/3b5rZy9lUbjMbZ2alZrYh/LksmWVXIPnMLUCpu18GdAeuTXF+YmZmBcAWPitLU2WMJa3dMrOJQJ67jwfOB/6aLCk7MBvY7u4TgD7A18mSsptZf+D28GHW/L4T5HGxu09094nAOJJYdgWSz0wGXgqP1wKTUpiXuHD3ancfBZSGSU2VMZa09uwg8MPwOAf4DtlT9heBfzWzPKAbMIbsKfsPgW+Hx9n0+94dmGtmb5jZM8AUklh2BZLP9ACOhsfHgKIU5iVRmipjLGntlrt/4O5vmNkNQATYSvaU/bi7nwBeJQioWfH/bmZfAbYDO8OkrCh3aDdwn7tfTlALnUMSy66NrT5zCOgaHnclM9ffaaqM58WQ1q6Z2fXAvcAs4AGypOxm1gM4DlxJ8I1yINlR9plAP2AaMJjgC0Q2lBtgL/Bug+PRJLHsqpF8Zg0wNTyeDKxLYV4SpakyxpLWbplZb2ARMNPdq8iisgN/B9zo7nXACeC7ZEHZ3f0rYf/Alwn6BheRBeUOfRP4spnlACMIfgeSVnYFks/8Eig2s7eBwwRvZqZpqoyxpLVntxNU8VeZ2QYgn+wp+38Af21mrwEfAz8le8reUDb9vv8YuBPYBDxHkv/PNbNdRERiohqJiIjERIFERERiokAiIiIxUSAREZGYKJCIxIEFa5oVxvgcF4ez0TGz7mZ2SXxyJ5JYGrUlEgdm9g9Agbt/p0FaDsHwyW0EE7u+CNS5+xEzywWK3f1PDa5fD/wbUA58Pvz5EZALvO7up5JTGpHW0cx2kTYwswuA9wmCRMP0V8LDEoLgsR34e+CvgMuBRWYWCa95m2AiGWY2imDOx36CCWWXEszMHkLwd7oZUCCRdkmBRKRtIsBvgX8C7gb+BvgZcKe7nzSzn4XXOXA18Aqw2t1X1j+BmeWYmXnQLPBdYAfwJvA9oDdg4b8/cPdPklEokbZQIBFpA3c/ZGY3EizHsQmYBwx295Ph+TsBwq0criBYkfcFM6sNH79G8Pd3n5kNBC4hCCR1BMve3xG+1AygV3JKJdI2CiQibWcEH/KXufttZva3zVz3GEFAmEPQPLUGuAFwd681s0+AvwUmubuH+8gMDO+9ANiTyEKIxEqBRKQNzOxSgqasqvDxKmCQmb0YXtIZuC88/i3wVYKaxtYw7W8Ilupe4u47G4346gPMD497E9ReRNotBRKRNnD394EJ9Y/N7PvAeuB37v67Buk5wPPAMoJayH8n2LHwEeAVM/uZu59u9PTlwOPh8RWJKoNIvGgeiUgbhftbX2lmzxI0c/0HMN/MXjSz4fWXEeyPUQk8Ey7tnufuFcDLwMQG1+WEw4KPE4wG2wb8KXyt3OSUSqT1NI9EpI3M7NHw8N/c/a0G6ZMJmrJuJqihTDSzDgTzQX4DfODudzcYsVW/x/wdQH+CDvczXgp4xN1/ndACibSRAomIiMRETVsiIhITBRIREYmJAomIiMREgURERGKiQCIiIjH5//8esyzn6PODAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(y_test, y_test_preds_rfr) #预测值和实际值的散点图\n",
    "plt.plot([0, max(y_test)], [0, max(y_test_preds_rfr)],   color='gray', lw=1, linestyle='--') #绘图\n",
    "plt.xlabel('实际值') #X轴\n",
    "plt.ylabel('预测值') #Y轴\n",
    "plt.title('实际值 vs. 预测值') #标题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "## 绘制模型性能比较图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAELCAYAAADQsFGkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAAiT0lEQVR4nO3deXxV5b3v8c+PkAFkFCKDQQKIWDwQj8ahgi2EmeLRXtuqgKi8FBTwcivovSg91qse24r0WLVwUEERqBSkYqmCzD3F6wAInApHrUIEEcTIpGQgye/+sXZiyEAiZmVgfd+v13691l772Ws9O8P67vWs53mWuTsiIhI9DWq7AiIiUjsUACIiEaUAEBGJKAWAiEhEKQBERCJKASAiElEKABGpF8wsycyWmdlWM3vBzOwkZe8ys1Ulnt9jZm+a2WtmlmBmZ5jZUjPbYGa/qZlPUPcoAESkvhgJ7HH3NKAlMKC8QmbWEbipxPPOwAXufjnwGpACjADedPdewAVm9r2wK18XKQBEpL7IAFbGltcAfSso9zgwpcTzfkBLM/srcCWwEzgENDGzOKARkBdGhes6BYCI1BetgMOx5SPAmaULmNlwYCuwvcTqZOCAu/+A4Nt/b+BPwGDgI2CHu38UYr3rLAWAiNQXXwDNY8vNY89LG0bwjf9F4GIzm0AQFu/HXv8YOJvgDGGGu6cCZ5rZFSHWu85SAIhIfbEaGBhbzgDWli7g7sPdvTdwPbDJ3Z8ENgHpsSLnEoRAUyAnti4XaBJivessqy+TwbVu3dpTU1NruxoiUksKCwv5+OOPycvLo1GjRrRv354DBw6QkpJSpmxubi6ZmZmcd955AGRmZnLs2DGSkpLo1KkTubm57Ny5E4CEhAQ6derESToV1WubNm36wt2Ty3utYU1X5lSlpqaycePG2q6GiEi9YmaZFb2mJiARkYhSAIiIRJQCQEQkourNNQA5vR0/fpw9e/aQk5NTeWGpVklJSaSkpBAfH1/bVZEapgCQOmHPnj00bdqU1NTU07Y3Rl3k7mRlZbFnzx46depU29WRGqYmIKkTcnJyaNWqlQ7+NczMaNWqlc68IkoBIHWGDv61Qz/36FIAiMQcOXKEoUOHUlhYCMDIkSPZvHkzS5cuLS7z6aef8rOf/QyArKwsDh48yK233sq2bdtOeb/5+fn06NGDgoIC6svATDk96BpALcvJyeEnP/kJu3fvpmfPnsydO7fCb2TTp0/n1VdfZdWqVeTn53PDDTewd+9eunXrxuzZs8tdV1+1bZvK/v0Vjl/51tq06ci+fbtOWua5557jjjvuYNeuXXTu3Jm4uDjatm3L8uXLufLKKznzzDNJTEwEYO/evbz00ks0btyYpKQkEhISTthWRkZGcZCU1rBhQ1atWoW7M27cOGbMmEFSUhL/8R//weLFi2nQIPhedvDgQTZt2vTdP/y3kJralszM/TW6T6lcx45t2LVrX7VvVwFQy+bNm0dKSgrLli1j2LBhrFy5koEDB5Ypl5mZyfPPP09ycjCi++WXXyYtLY1FixYxZMgQtmzZwj/+8Y8y6y688MIa/kTVIzj4V9+34f37T97MsW/fPt5991369OnDjTfeyNSpU/nwww+ZOHEiSUlJPP744/Tt25cPP/yQ48ePM2rUKDp06MDOnTvJzMzkvffeo0GDBsycOZOuXbuSkJDA8uXLy93XkCFDgKDpZfv27bg7iYmJjBs3jnHjxhWXu/zyy6vt81dVZuZ+dBJS95iFE8oKgFq2Zs0arr32WiD41rh27dpyA2DixIk88sgjTJ8+HYDBgwczdOhQ8vPzOXToEM2aNSt3nVTN0qVLefvttxk4cCArV65k3rx5tG/fnvvuu4+0tDQ2btzI9u3bMTMSExOZMmUKt912G1u2bOHOO+9kwoQJnH/++cXba9gw+NcaOHAgeXnBVPOJiYmsWLGCuLi44nJmxrFjx4rPIPLz84vfKxI2/aXVsqysLJo3D2a4bdasGe+//36ZMgsWLCAtLY3u3bsXr2vSJJi88LLLLqNdu3Z07ty5+LXy1snJjR07lv79+zN79mx69OhBly5dePPNN5k0aRLJycmkpqbSvXv34q6Sl156KevXrz9hGwUFBTRo0OCEJryEhARef/11AIYNG1buvo8ePUrLli3Zt28f1113nfrjS43RReBa1rp1aw4fDu5xcfjwYVq3bl2mzLJly1i9ejXXX389mzZt4sknnyQrK4vc3FzeeOMNDh48yNq1a8tdJ1Wzb98+rrnmGuLi4pg3bx7nnnsuEydO5IorrqB37940b96cUaNGkZaWVvyehQsXMnToUP7yl79wxx13MGTIED777LMTtpubm0ufPn3o06dP8ZlASfn5+bz33nt0796dtm3bsn79elat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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np #导入NumPy\n",
    "  \n",
    "# function to add value labels\n",
    "def addlabels(x,y):\n",
    "    for i in range(len(x)):\n",
    "        plt.text(i/50+x[i], round(y[i], 3)+0.02, round(y[i], 3), ha = 'center')\n",
    "\n",
    "# fig = plt.figure()\n",
    "fig, ax = plt.subplots()    \n",
    "# ax = fig.add_axes([0,0,1,1])\n",
    "# scaler = ['StandardScaler', 'MinMaxScaler']\n",
    "\n",
    "width = 0.25\n",
    "\n",
    "# bars1 = [r2_score(y_train, model_lr.predict(X_train_norm)),\n",
    "#          r2_score(y_train, model_lasso.predict(X_train_norm)),\n",
    "#         r2_score(y_train, model_ridge.predict(X_train_norm))]\n",
    "bars1 = [r2_score(y_valid, model_lr.predict(X_valid))]\n",
    "bars2 = [r2_score(y_valid, model_dtr.predict(X_valid))]\n",
    "bars3 = [r2_score(y_valid, model_rfr.predict(X_valid))]\n",
    " \n",
    "# The x position of bars\n",
    "r1 = np.arange(len(bars1))\n",
    "r2 = [x + width for x in r1]\n",
    "r3 = [x + width*2 for x in r1]\n",
    " \n",
    "# Create blue bars\n",
    "plt.bar(r1, bars1, width = width, color = 'blue', edgecolor = 'black', capsize=7, label='线性回归')\n",
    " \n",
    "# Create cyan bars\n",
    "plt.bar(r2, bars2, width = width, color = 'cyan', edgecolor = 'black', capsize=7, label='决策树回归')\n",
    "\n",
    "# Create cyan bars\n",
    "plt.bar(r3, bars3, width = width, color = 'yellow', edgecolor = 'black', capsize=7, label='随机森林回归')\n",
    "\n",
    "# general layout\n",
    "# plt.xticks([r + width/2 for r in range(len(bars1))], ['训练集', '测试集'])\n",
    "plt.xticks([r + width for r in range(len(bars1))], ['验证集'])\n",
    "plt.ylabel('R2分数')\n",
    "plt.xlabel('模型')\n",
    "plt.legend()\n",
    "\n",
    "\n",
    "# calling the function to add value labels\n",
    "addlabels(r1, bars1)\n",
    "addlabels(r2, bars2)\n",
    "addlabels(r3, bars3)\n",
    " \n",
    "# Show graphic\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
